/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package negocio;

import java.util.ArrayList;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import modelo.Rota;
import modelo.Sede;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;



public class RotaNegocio  {
    
    private static EntityManagerFactory emf = 
            Persistence.createEntityManagerFactory("Tranex");
    private static EntityManager em = emf.createEntityManager();

    public static void iniciarTransacao() {
        em.getTransaction().begin();
    }
    public static void finalizarTransacao() {
        em.getTransaction().commit();
    }
        public static void voltarTransacao () {
    	em.getTransaction().rollback();
    }
    
    public static void limpar() {
        em.clear();
    }
    public static void gravar(Rota rota) {
        
        em.persist(rota);
    }
    
    public static void atualiza(Rota rota) {
        
        em.merge(rota);
    }
    
    public static void excluir(Rota rota) {
        em.remove(rota);
    }
    
    public static Rota findByPk(Integer codRota) {
        return em.find(Rota.class, codRota);
    }
    
    public static ArrayList<Rota> findBy(Rota rota){
    	ArrayList<Rota> rotas = new ArrayList<Rota>();
    	Session session = HibernateUtil.getSessionFactory().openSession();
    	Example parametro = Example.create(rota)
    	.excludeZeroes() //exclude zero valued properties
    	.ignoreCase() //perform case insensitive string comparisons
    	.enableLike(MatchMode.ANYWHERE)//use like for string comparisons
    	; 

      	  Criteria criteria = session.createCriteria(rota.getClass()).add( parametro);
      	  if(criteria.list().isEmpty()){
    		  rotas= new ArrayList<Rota>();
    	  }
    	  else
    	  {   
    		rotas = (ArrayList<Rota>) criteria.list();
    	  }	
    	return rotas;
    	
    }
    
    public static ArrayList<Rota> findAll(){
    	ArrayList<Rota> rotas = (ArrayList<Rota>) em.createQuery("from Rota rota ORDER BY rota.codRota").getResultList();
    	return rotas;
    	
    	
    }
    
    public static ArrayList<Rota> findByOrigemDistancia(Rota rotaOrigem){
    	
    	ArrayList<Rota> rotas = (ArrayList<Rota>) em.createQuery("from Rota rota where rota.codigoSedeOrigem ="+rotaOrigem.getCodigoSedeOrigem()+" ORDER BY rota.distancia").getResultList();
    	return rotas;
    	
    	
    }
    
    public static ArrayList<Rota> findAll(int codRota){
    	ArrayList<Rota> rotas = (ArrayList<Rota>) em.createQuery("from Rota rota where rota.codRota="+codRota+"ORDER BY rota.codRota").getResultList();
    	return rotas;
    }
    public static ArrayList<Rota> findByIdSede(Sede sede){
    	ArrayList<Rota> rotas;
    	if(em.createQuery("from Rota rota where rota.codigoSedeOrigem="+sede.getCodSede()+" or rota.codigoSedeDestino="+sede.getCodSede()+"ORDER BY rota.codRota").getResultList().isEmpty()){
    		rotas= new ArrayList<Rota>();
    	}
    	else
    	{	
    		rotas = (ArrayList<Rota>) em.createQuery("from Rota rota where rota.codigoSedeOrigem="+sede.getCodSede()+" or rota.codigoSedeDestino="+sede.getCodSede()+"ORDER BY rota.codRota").getResultList();
    	}
    	return rotas;
    }
}
